package com.mouse.damo.ui;

import javax.swing.*;
import javax.swing.border.EmptyBorder;
import javax.swing.border.LineBorder;
import java.awt.*;
import java.awt.Window.Type;
import java.awt.event.MouseAdapter;
import java.awt.event.MouseEvent;
import java.io.File;


/**
 * UI界面方面
 *
 * @author 管雷鸣
 */
public class UI {
    /**
     * confirm弹出提示框-选择了是
     */
    public final static int CONFIRM_YES = 0;

    /**
     * confirm弹出提示框-选择了否
     */
    public final static int CONFIRM_NO = 1;

    /**
     * confirm弹出提示框-选择了取消
     */
    public final static int CONFIRM_CENCEL = 2;


    /**
     * 鼠标跟随提示信息的显示界面
     */
    static JFrame jframeMessageForMouse;
    static JLabel jlabelMessageForMouse;

    static {
        jframeMessageForMouse = new JFrame();
        jframeMessageForMouse.setUndecorated(true);
        jframeMessageForMouse.setType(Type.POPUP);
        jframeMessageForMouse.setAlwaysOnTop(true);
        JPanel jp = new JPanel();
        jp.setBorder(new LineBorder(java.awt.Color.RED, 1, true));
        jframeMessageForMouse.setContentPane(jp);
        jp.setLayout(new CardLayout(0, 0));

        jlabelMessageForMouse = new JLabel("New label");
        jlabelMessageForMouse.setVerticalAlignment(SwingConstants.TOP);
        jlabelMessageForMouse.setHorizontalAlignment(SwingConstants.LEFT);
        jlabelMessageForMouse.setHorizontalTextPosition(SwingConstants.LEFT);
        jlabelMessageForMouse.setAutoscrolls(true);
        jlabelMessageForMouse.addMouseListener(new MouseAdapter() {
            @Override
            public void mouseClicked(MouseEvent e) {
                jframeMessageForMouse.setVisible(false);
            }
        });
        jlabelMessageForMouse.setBorder(new EmptyBorder(10, 10, 10, 10));
        jp.add(jlabelMessageForMouse, "name_24011468992203");
    }


    /**
     * 在当前屏幕上显示一段信息提示，配合{@link UI#hiddenMessageForMouse()} 使用
     *
     * @param x      信息显示框的左上角在屏幕的x坐标
     * @param y      信息显示框的左上角在屏幕的y坐标
     * @param width  显示的提示框宽度
     * @param height 显示的提示框高度
     * @param html   显示的文字，支持html格式
     * @return 显示文字的组件JLabel，可对此组件进行调整
     * @see UI#showMessageForMouse(MouseEvent, int, int, String)
     */
    public static JLabel showMessageForMouse(int x, int y, int width, int height, String html) {
        jlabelMessageForMouse.setText("<html>" + html);
        jframeMessageForMouse.setBounds(x + 10, y + 10, width, height);
        jframeMessageForMouse.setVisible(true);

        return jlabelMessageForMouse;
    }


    /**
     * 隐藏鼠标跟随的信息提示 配合 {@link UI#showMessageForMouse(MouseEvent, int, int, String)} 使用
     */
    public static void hiddenMessageForMouse() {
        jframeMessageForMouse.setVisible(false);
    }

    /**
     * 显示鼠标跟随的信息提示，配合{@link UI#hiddenMessageForMouse()} 使用
     *
     * @param mouseEvent 添加鼠标监听后，传入鼠标的监听对象 java.awt.event.MouseEvent
     * @param width      显示的提示框宽度
     * @param height     显示的提示框高度
     * @param html       显示的文字，支持html格式
     * @return 显示文字的组件JLabel，可对此组件进行调整
     * @see UI#showMessageForMouse(int, int, int, int, String)
     */
    public static JLabel showMessageForMouse(MouseEvent mouseEvent, int width, int height, String html) {
        int x = 0;
        int y = 0;
        if (mouseEvent != null) {
            x = mouseEvent.getXOnScreen();
            y = mouseEvent.getYOnScreen();
        }

        return showMessageForMouse(x, y, width, height, html);
    }


    /**
     * 弹出提示框，
     *
     * @param message 要显示的信息，支持HTML
     */
    public static void showMessageDialog(String message) {
        JOptionPane.showMessageDialog(null, "<html>" + message);
    }

    /**
     * 弹出选择、确认框
     *
     * @param message 要显示的信息 ，支持HTML
     * @return int {@link #CONFIRM_YES} {@link #CONFIRM_NO} {@link #CONFIRM_CENCEL}
     */
    public static int showConfirmDialog(String message) {
        return JOptionPane.showConfirmDialog(null, "<html>" + message);
    }


    /**
     * 创建此程序的系统托盘，本程序的托盘创建、以及使用返回的对象进行托盘弹出信息提示等
     * <li>MyEclipse编辑时一般菜单会出现中文乱码，不用在意。打包出去后会正常。
     * <li>简单使用：<pre>SystemUtil.createTray(MyClassName.class.getResource("res/icon.png"), "显示文字", null)</pre>
     * <li>高级使用：<a href="http://www.xnx3.com/doc/j2se_util/20150307/131.html">http://www.xnx3.com/doc/j2se_util/20150307/131.html</a>
     *
     * @param imageIcon 托盘的图标所在路径。若图片过大会不显示！建议尺寸15*15的png图片。 如 <pre>new ImageIcon(MyClassName.class.getResource("res/icon.png"))</pre> 其中trayico.png在当前的目录下的res文件夹内，MyClassName为当前生成次托盘的类名
     * @param title     鼠标放到托盘图标上时显示的文字
     * @param popupMenu 托盘右键点击后弹出的菜单项。若不想有菜单项或者不需要，可传入null
     * @return {@link TrayIcon} 对象。若是返回null，则创建失败
     */
    public static TrayIcon createTray(ImageIcon imageIcon, String title, PopupMenu popupMenu) {
        TrayIcon trayIcon = null;
        SystemTray sysTray = SystemTray.getSystemTray();// 获得当前操作系统的托盘对象

        trayIcon = new TrayIcon(imageIcon.getImage(), title, popupMenu);

        try {
            sysTray.add(trayIcon);        //将托盘添加到操作系统的托盘
            return trayIcon;
        } catch (AWTException e1) {
            // TODO Auto-generated catch block
            e1.printStackTrace();
            return null;
        }
    }

    /**
     * 读取文件内容，通过用户自己打开文件选择框的方式
     *
     * @param encode 以什么编码读取文件，如：{@link FileUtil#UTF8}
     * @return 文件的内容，若用户没有打开或者打开失败，返回null
     */
    public static String readFileByJFileChooser(String encode) {
        String xnx3_content = null;
        JFileChooser jfc = new JFileChooser(".");
        jfc.setFileSelectionMode(JFileChooser.FILES_ONLY);
        int result = jfc.showOpenDialog(jfc);
        if (result == 0) {    //用户选择了打开
            try {
                File file = jfc.getSelectedFile();
                FileUtil f = new FileUtil();
                xnx3_content = f.read(file, encode);
                file = null;
            } catch (Exception e) {
                e.printStackTrace();
            }
        }
        jfc = null;
        return xnx3_content;
    }

}
